package tree

import "fmt"

/*
这里的面向对象 有且只有封装 而继承和多态由 接口去完成
所以,结构体,只有struct 没有class 因为不需要继承和多态
*/
type Node struct {
	Value       int
	Left, Right *Node // 为什么做指针呢 我认为 它只是一个地址值 就是对树结构的一种描述
}

// 没有构造函数 但是有工程函数 这和平常使用一个设计模式的想法好想
func CreateNode(value int) *Node {
	return &Node{Value: value} // 可以返回局部变量的地址 在需要时,在堆中,且参与垃圾回收 不需要时 在栈中,方法掉了它也掉了
}

func (node Node) Print() {
	// 这里 从结构体node中 拷贝一个值 来输出
	fmt.Println(node)
}

// 显示定义和命名 方法接受者
// 只有使用指针 才能改变结构的内容
func (node *Node) SetValue(value int) {
	if node == nil { // 可以进来 , 就说明一个问题了 nil 可以调用方法
		fmt.Println("Setting Value to nil node,Ignored.")
		return
	}
	node.Value = value
}

/*
值接受者 不能改值 指针接受者可以
结构体大 就用指针接受者
如果用了指针接受者 尽量都用指针接受者
值接受者 是go特有的
*/
